連載 / Pe 日活用のヒント [ カテゴリー 2 , URL4, URL5, URL6, URL7] [ カテゴリー 1 , URLI, URL2, URL3], 262 sub single—page—article { ・ single-page-article らカー方がトップページの index. html よりも新しければ そして、 $src-mtime とテンプレートの更新日時のどち 事の更新日時は目次データとして格納されている ・ Top ファイルに含まれるすべての記事の更新日時。各記 ・ Top ファイルの更新日時 しいものがサイトの更新日時として $src-mtime に入る。 時を調べる。具体的には、以下の項目のなかでもっとも新 ら Top ファイルを読み込む。続いてサイト全体の更新日 single-page-article と同じようにデータを準備してか になっている。 ストを参照 ) も、 single_page-article メソッドと似た流れ トップページを生成する t 叩 -page メソッド ( 末尾のリ top-page URL である。 名、それに続く要素はそのカテゴリーに属する記事の相対 照である。参照されている配列の最初の要素はカテゴリー 値は配列への参照であり、その配列の各要素も配列への参 照を表すことを利用している。つまり、 read-top の戻り この表記は、 Perl では [ ・・・・・ ] が名前のない配列への参 再生成をおこなう。 -force オプションが指定されていれば 無条件に再生成をおこなうのは、ほかの HTML 生成メソ ッドと共通している。 top-page の処理の中心は、 Top ファイルをもとにした 目次の生成である。 Top ファイルでは記事がカテゴリー とに列挙されているので、目次の生成は 2 重のループにな る。外側のループがカテゴリーのループ、内側のループが カテゴリー内の記事のループである。 目次のデータが生成されたらそれをテンプレートにはめ 込み、 HTML ファイルを出力して終了となる。 ☆ 以上で genhtpg のコードの説明は終了である。実際に 使っていただくのはもちろん、 perl による HTML 処理の 例として遊んでいただいてもかまわない。 RSS フィードを 生成する機能を追加するなどの拡張を施してみるのも、よ い勉強になるのではないだろうか。 ( いまづ・ひでよモルガン・スタンレー証券 ) 263 264 265 266 267 268 269 270 2 71 272 273 274 275 276 277 2 78 279 280 281 my ($self , $path) my $verbose $self—>{verbose}; if ( stat($dstpath)->mtime > = max($src—mtime , stat ($tmplpath)—>mtime) ) # the following condition is met when re—generation is NOT needed if ( -f $dstpath ) { stat ($path) —>mtime ; my $src_mtime # determine if the page is t0 be generated my $tmplpath = $self—>tmplpath($relpath) ; my $dstpath "$self->{dstdir}/$relpath" s:/index. html?$:/:i; $urlfromtop my $urlfromtop = $relpath; $self->relpath-topurl($path) ; my ($relpath, $topurl) else { . \ Ⅱ " if ( $verbose ) ; print "forced tO generate . if ( $self->{force} ) { UNIX MAGAZINE 2005. 11 103
連載 / Pe 日活用のヒント リスト 2 read-top 129 sub read—top { 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 15 2 153 154 155 156 157 158 159 160 161 162 163 } my $top—f ile shift ; my $fh = 工 0 : :Fi1e—>new(" く $top_file") or do { $name = $newname ; push(@retval , [$name, @cont] ) ; if ( $name & & @cont ) { my $newname = $ 1 ; if ( $line /A\S*\#/ Ⅱ $line next if ( $line chomp $line ; while ( my $line my @cont my $name my @retval ; exit 0 ; print "open: $top—file : $ ! \ Ⅱ " @cont elsif ( $line push (@cont , else { $ 1 ) print "invalid line : $line\n" if ( $name & & @cont ) { push(@retval, [$name , $fh → close() ; \@retval ; @cont] ) ; クになっておらす、太字で表記される。つまり、目次はペ ージごとに異なるのである。 記事内の目次の生成に続き、内容ファイルの本文をテン プレートにはめ込む。この際に内容ファイルを HTML:: TreeBuilder で読み込んでいる。前節で説明した部分で各 内容ファイルを HTML::TreeBuilder で読み込んでいる ので、その際に内容ファイルの本文を $page[$n]{body} に保存することも考えられるが、そうはしていない。なぜ なら、そうするとすべてのページの本文を溜め込むことに なり、メモリ消費が多くなると考えたからである。実際に は上記のようにしてもメモリが足りなくなることはないと 思うが、メモリ消費を簡単に抑えられるのならそうしたほ うがよいと判断した。 目次データの登録 長い記事は複数のページで構成されるが、 genhtpg から みると 1 つの記事であり、目次データには 1 つの項目が登 102 録されるだけである。 481 行目でその処理をおこなってい るが、 single-page-article で \%param を渡していたの とは異なり $spec を渡している。 $spec には Spec ファイ ルの内容が十内されている。 $self—>{contdb}{$urlfromtop} = mkcontdbent=> ($src—mtime, $spec) ; read-top トップページを生成する top-page メソッドを説明する 前に、そのなかで使われるサプルーチン read-top ( リス ト 2 ) を説明しておこう。 read-top はその名が示すとお り Top ファイルを読み込むサプルーチンで、これを知って おくことは top-page メソッドの理解に役立つ。 頭に入れておくべきなのは、 read-top がどのような形 式のデータを返すのかという点である。 PerI ふうに表現す ると、 read-top が返すのは以下のようなデータである。 UNIX MAGAZINE 2005 . 11
連載 / Pe 日活用のヒント 図 1 記事内の目次 ( 1 ) イ , 編邸 0 〒修助 0 ツール迅ア ・ cont—filename 内容ファイルの名前が入るパスではなく C01. html と 0 、。た単純なフ , イル名はある。 ・ dst-filename 公開用 HTML ファイルの名前が入る。内容ファイルの 名前とは関係なく index. html 、 index2. html 、 index 3. htm い・・・・のいずれかになる。 ・ chapter—name 章を構成すると定義しており、章の名前は内容ファイル の body タグの最初のタグの内容である。 ・ num ページ番号が入る。公開用 HTML ファイルの題名、つ ( 2 ) ・・・・といったページ番号が入るのでそこに使用され る。 ・ url 記事を構成するほかのページから呼び出せるようにする ための URL が入る。これは記事内の目次のなかで使わ ライブ・ストリーミングの保存 0 URL が、、 " になるところか遅つ。 w•ndows M 。 dia ライプ・ストリーミングの保存の例 ・ prev-page 無駄な再生成を避けるための判断をする際には、複数あ 1 つの記事における前のページの URL が入る。最初の る公開用 HTML ファイルのなかの 1 ページ目 (index. ページにはこの項目はない。 html) だけを考えればよい。長い記事の公開用 HTML フ ・ next-page ァイルはすべて一括して生成されるからである。 1 つの記事における次のページの URL が入る。最後の 具体的には、 $src-mtime かテンプレートの更新日時の ページにはこの項目はない。 どちらカー方が index. html より新しけれは再生成をおこ たとえば、、 $page[0]{ "cont-filename" } " には、最初の なう。 -force オプションが推定されていると無条件に再生 ページに対応する内容ファイルの名前が入る。 成するのはほかの HTML 生成メソッドと共通している。 各ページのデータの準備 HTML ファイルの生成 長い記事では、記事内の目次や前後のページへのリンク 各ページのデータが@page に揃ったところで、 / ヾーシ など、公開用 HTML ファイルの生成に必要なデータが短 の生成をおこなう。 い記事よりも多い。記事内の目次 ( 図 1 ~ 2 ) など、内容フ この部分で single-page-article にはなかった処理とし ァイルをすべて読み込まないと分からない項目もあるので、 ては、記事内の目次の生成が挙げられる。長い記事では、各 各内容ファイルを読み込みながらページの生成に必要なデ ページの先頭に、目次として記事内のほかのページへのリ ータを@page 配列ロ内する。 ンクが並べてある ( 図 1 ~ 2 参照 ) 。目次の項目は全ページ @page 配列の要素はハッシュへの参照で、ハッシュには 共通だが、ほかのページの項目がハイバーリンクになって 以下の項目が十絲される。 いるのに対して、自分のページの項目だけはハイバーリン Net Transp 。杙によるストリーミング保存の実例と応用 目次 プ里 Net Transport とは はじめに 図 2 言内の目次 ( 2 ) 方イルの災仮 ) 第示参動ヴマークツー罹へ井プ つおに立「・物第料新 1 はス響 : ・ミ . 増ぎ物ドに窶明・朝 Net Transp 。によるストリーミング保存の実例と応用 目次 2 ーライブ・ストリーミングの保存 3 年純ンデ二こ阯ストリこ二クの保存 101 UNIX MAGAZINE 2005. 11